In diesem Kapitel schauen wir uns das Datenformat JSON etwas genauer an. Die JavaScript Object Notation (JSON) ist ein kompaktes Datenformat in einer einfach lesbaren Textform zum Zweck des Datenaustauschs zwischen Anwendungen. JSON wird zur Übertragung und zum Speichern von strukturierten Daten eingesetzt; es dient als Datenformat bei der Serialisierung. Insbesondere bei Webanwendungen und mobilen Apps wird es in Verbindung mit JavaScript, Ajax oder Web-Sockets zum Transfer von Daten zwischen dem Client und dem Server häufig genutzt. Jedes gültige JSON-Dokument soll ein gültiges JavaScript sein und per "eval" interpretiert werden können. Davon abgesehen ist JSON aber unabhängig von der Programmiersprache. Parser existieren in praktisch allen verbreiteten Sprachen. Welche JSON-Datentypen gibt es? Es gibt einen Nullwert. Er wird durch das Schlüsselwort null dargestellt. Ein boolescher Wert wird durch die Schlüsselwörter true und false dargestellt. Dies sind keine Zeichenketten. Eine Zahl ist eine Folge der Ziffern null bis neun. Diese Folge kann durch ein negatives Vorzeichen eingeleitet und einen Dezimalpunkt unterbrochen sein. Die Zahl kann durch die Angabe eines Exponenten klein oder groß eh ergänzt werden, dem ein Vorzeichen plus oder minus und eine Folge der Ziffern null bis neun folgt. Eine Zeichenkette in JSON beginnt und endet mit doppelten geraden Anführungszeichen. Sie kann Unicode-Zeichen und Escape-Sequenzen enthalten. Als Zeichenkodierung benutzt JSON standardmäßig UTF-8. Auch UTF-16 und UTF-32 sind möglich. Ein Array beginnt mit der eckigen Klammer auf und endet mit der eckigen Klammer zu. Es enthält eine durch Kommata geteilte, geordnete Liste von Werten gleichen oder verschiedenen Typs. Leere Arrays sind zulässig. Hier sind Beispiele für Arrays von Monaten, Primzahlen und boolschen Werten. Ein JSON-Objekt beginnt mit geschweifter Klammer auf und endet mit geschweifter Klammer zu. Es enthält eine durch Kommata geteilte, ungeordnete Liste von Eigenschaften. Objekte ohne Eigenschaften, also leere Objekte, sind zulässig. Die Daten können beliebig verschachtelt werden, beispielsweise ist ein Array von Objekten möglich. Eine Eigenschaft besteht aus einem Schlüssel und einem Wert, getrennt durch einen Doppelpunkt. Die Schlüssel sollten eindeutig sein, da unterschiedliche Parser mit mehrfach vorkommenden Schlüsseln unterschiedlich umgehen. Der Schlüssel ist eine Zeichenkette. Der Wert ist einer der Datentypen. JSON unterstützt nicht alle von JavaScript unterstützten Datentypen. Daher werden bei der Serialisierung NaN, Infinity und Minus Infinity zu null serialisiert, Date-Objekte als String in das ISO-8601-Format konvertiert und Function-, RegularExpression- und Error-Objekte werden verworfen. Ein JavaScript-Objekt im JSON-Format ist eine Liste von Schlüssel-Wert-Paaren in geschweiften Klammern. Als Syntax also immer Schlüssel-Doppelpunkt-Wert, durch Komma getrennt. Hier sehen Sie ein Beispiel eines Studenten mit Namen, Alter und einer Note. Der Student besteht auch aus einer Adresse, die eine Straße, Postleitzahl und einen Ort hat. Hier sehen Sie, wie Sie die Eigenschaften des Studenten auslesen können. Es gibt hier keine Datenkapselung, diese Objekte sind eher mit Structs in C zu vergleichen. JavaScript-Objekte können auch als assoziatives Array aufgefasst werden. Die Schlüssel beziehungsweise Namen der Eigenschaften sind dann immer Zeichenketten. Der Zugriff kann dann auch über ein assoziatives Array erfolgen. Im Objekt-Literal können auch Funktionen zugewiesen werden. Die Syntax lautet hier: Name der Funktion, Doppelpunkt, "function" gegebenenfalls mit Eingabeparametern und dann der Funktionsrumpf in geschweiften Klammern. Die Funktion kann dann wie gewohnt auf dem Objekt aufgerufen werden. Vergleichen wir einmal JSON mit XML. XML ist eine struktur-beschreibende Sprache. JSON im Gegensatz dazu eine Syntax-Konvention und überhaupt nicht deklarativ. Für den Datenaustausch an einer fest definierten Schnittstelle ist XML deutlich besser geeignet. JSON ist für flexible Schnittstellen besser geeignet. Eine Stärke von JSON liegt darin, dass es sich um valides JavaScript handelt. Damit lässt sich eine JSON-Definition in JavaScript direkt mit der eval-Funktion in ein JavaScript-Objekt umsetzen. Bei Daten aus unsicheren Quellen sollte aber ein Parser verwendet werden, da eval auch gegebenenfalls schädliche Programmanweisungen ausführt. XML ist eine Auszeichnungssprache und somit vielseitiger einsetzbar als JSON, das ein Datenaustauschformat ist. XML ist weiter verbreitet, wird jedoch von JSON aufgrund seiner Einfachheit dort zurückgedrängt, wo keine komplizierten Auszeichnungen notwendig sind. Beide Formate sind nicht gut zum Repräsentieren von Binärdatenmengen geeignet, da beide keinen Binärdatentyp unterstützen und zeichenweise interpretiert werden müssen. Die Syntax von JSON ist viel einfacher gestaltet und erscheint daher oft lesbarer und insbesondere leichter schreibbar. In der Regel produziert JSON auch geringeren Overhead im Vergleich zu XML. Hier haben wir dieselben Daten einer Person, einmal als JSON und zweimal als XML dargestellt. JSON-Objekte sind in der Regel circa dreißig Prozent kleiner als XML-Dokumente, wenn man XML-Elemente statt Attribute verwendet. Das liegt vor allem an den ausgeschriebenen Ende-Tags. Im Gegensatz zu XML gibt es bei JSON keine Grammatiken wie DTD oder Schema. Welches Format bevorzugen Sie und warum?